from flask import jsonify
from sqlalchemy.exc import SQLAlchemyError, DBAPIError
from MySQLdb import OperationalError
from apps.stock import stock


# 在蓝本中编写错误处理程序稍有不同，如果使用 errorhandler 装饰器，那么只有蓝本中的错误才能触发处理程序。
# 要想注册应用全局的错误处理程序，必须使用 app_errorhandler 装饰器。

# 404错误处理
@stock.app_errorhandler(400)
def page_400(e):
    return jsonify({
        'code': 400,
        'msg': 'Bad request,'+str(e)
    })


@stock.app_errorhandler(404)
def page_404(e):
    return jsonify({
        'code': 404,
        'msg': 'Not found,' + str(e)
    })


# 500错误处理
@stock.app_errorhandler(500)
def server_500(e):
    return jsonify({
        'code': 500,
        'msg': 'Internal Server Error,' + str(e)
    })


# 捕获数据库模型相关错误
@stock.app_errorhandler(SQLAlchemyError)
def sql_base_error(e):
    return jsonify({
        'code': 1009,
        'msg': 'Mysql Error,' + str(e)
    })


# 数据库接口错误
@stock.app_errorhandler(DBAPIError)
def sql_b_error(e):
    return jsonify({
        'code': 1009,
        'msg': 'Mysql Error,' + str(e)
    })


# 自定义错误
class ValidationError(Exception):
    """自定义错误"""
    def __init__(self, **kwargs):
        self.kwargs = kwargs
        super()


@stock.app_errorhandler(ValidationError)
def self_define_error(e):
    return jsonify(e.kwargs)
